﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace GatoRatoQueijo
{
    class Bringel : Objeto2D
    {
        private const float FRICTION = 0.15f;
        private const float ACELERATION = 0.2f;
        private const float MAX_VELOCITY = 4f;

        public float velocidadeX, velocidadeY;

        GameWindow window;


        public Bringel(Texture2D textura, GameWindow window, Nullable<Rectangle> sourceRetangle, float depth)
            : base(textura, sourceRetangle, depth)
        {
            velocidadeX = velocidadeY = 0;
            this.window = window;
            ScaleX = 0.25f;
            ScaleY = 0.25f;
            x = y = 60;
        }

        public void update(KeyboardState keyboard, GamePadState gamePad)
        {
            verifyMovement(keyboard, gamePad);
            verifyFriction(keyboard, gamePad);
            verifyCollisionWithBounds();
            verifyMaxVelocity();



            this.x += velocidadeX;
            this.y += velocidadeY;

         
        }

        private void verifyMovement(KeyboardState keyboard, GamePadState gamePad)
        {
            if (keyboard.IsKeyDown(Keys.Right))
            {
                velocidadeX += ACELERATION;
            }
            else if (keyboard.IsKeyDown(Keys.Left))
            {
                velocidadeX -= ACELERATION;
            }

            if (keyboard.IsKeyDown(Keys.Up))
            {
                velocidadeY -= ACELERATION;
            }
            else if (keyboard.IsKeyDown(Keys.Down))
            {
                velocidadeY += ACELERATION;
            }

             
            velocidadeX += ACELERATION * gamePad.ThumbSticks.Left.X;

            velocidadeY -= ACELERATION * gamePad.ThumbSticks.Left.Y;
            
        }
       
        private void verifyFriction(KeyboardState keyboard, GamePadState gamePad)
        {
            if ((keyboard.IsKeyUp(Keys.Right)) && (keyboard.IsKeyUp(Keys.Left)))
            {
                if (velocidadeX > 0)
                {
                    velocidadeX -= FRICTION;
                }
                else if (velocidadeX < 0)
                {
                    velocidadeX += FRICTION;
                }

                if((velocidadeX > -FRICTION) && (velocidadeX < FRICTION))
                {
                    velocidadeX = 0;
                }
            }

            if ((keyboard.IsKeyUp(Keys.Up)) && (keyboard.IsKeyUp(Keys.Down)))
            {
                if (velocidadeY > 0)
                {
                    velocidadeY -= FRICTION;
                }
                else if (velocidadeY < 0)
                {
                    velocidadeY += FRICTION;
                }

                if ((velocidadeY > -FRICTION) && (velocidadeY < FRICTION))
                {
                    velocidadeY = 0;
                }

            }

        }

        public void verifyCollisionWithBounds()
        {
            if (this.x + this.Width / 2 > window.ClientBounds.Width)
            {
                velocidadeX = 0;
                this.x = -(this.Width / 2) + window.ClientBounds.Width;
            }
            else if (this.x - this.Width / 2 < 0)
            {
                velocidadeX = 0;
                this.x = this.Width / 2;
            }

            if (this.y + this.Height / 2 > window.ClientBounds.Height)
            {
                velocidadeY = 0;
                this.y = -(this.Height / 2) + window.ClientBounds.Height;
            }
            else if (this.y - this.Height / 2 < 0)
            {
                velocidadeY = 0;
                this.y = this.Height / 2;
            }
        }

        private void verifyMaxVelocity()
        {
            if (velocidadeX > MAX_VELOCITY)
            {
                velocidadeX = MAX_VELOCITY;
            }
            else if (velocidadeX < -MAX_VELOCITY)
            {
                velocidadeX = -MAX_VELOCITY;
            }

            if (velocidadeY > MAX_VELOCITY)
            {
                velocidadeY = MAX_VELOCITY;
            }

            else if (velocidadeY < -MAX_VELOCITY)
            {
                velocidadeY = -MAX_VELOCITY;
            }
        }


        public override void draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            if (Math.Round((double)(gameTime.TotalGameTime.Milliseconds / 100)) >= 5)
                rotation = 15;
            else
                rotation = -15;

            base.draw(gameTime, spriteBatch);
        }

    }
}
